package org.example.campusforum.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.example.campusforum.entity.Article;
import org.example.campusforum.entity.ArticleImage;
import org.example.campusforum.entity.ArticleLike;
import org.example.campusforum.entity.User;
import org.example.campusforum.vo.CommentVO;

import java.util.List;

/**
 * 文章数据访问层接口
 *
 * 提供文章相关的数据库操作，包括文章的增删改查、点赞操作、浏览量统计等功能。
 * 继承MyBatis Plus的BaseMapper接口，提供基础的CRUD操作。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@Mapper
public interface ArticleMapper extends BaseMapper<Article> {

    /**
     * 根据ID逻辑删除文章
     *
     * 将文章的is_deleted字段设置为1，实现逻辑删除。
     * 不会物理删除数据库记录，便于数据恢复和审计。
     *
     * @param id 文章ID
     */
    @Update("update article set is_deleted = 1 where id = #{id}")
    void logicalDeleteById(Long id);

    /**
     * 根据ID获取文章信息
     *
     * 查询指定ID的文章详细信息。
     *
     * @param id 文章ID
     * @return 文章实体对象
     */
    Article getArticle(@Param("id") Long id);

    /**
     * 根据文章ID获取文章图片列表
     *
     * 查询指定文章的所有图片信息。
     *
     * @param id 文章ID
     * @return 文章图片列表
     */
    List<ArticleImage> getArticleImage(@Param("id") Long id);

    /**
     * 根据用户ID获取用户信息
     *
     * 查询指定ID的用户基本信息。
     *
     * @param id 用户ID
     * @return 用户实体对象
     */
    User getUserMapper(@Param("id") Long id);

    /**
     * 增加文章点赞数
     *
     * 将指定文章的点赞数加1。
     *
     * @param id 文章ID
     * @return 影响的行数
     */
    int like(@Param("id") Long id);

    /**
     * 增加文章浏览量
     *
     * 将指定文章的浏览量加1。
     *
     * @param id 文章ID
     */
    void view(Long id);

    /**
     * 检查用户是否已点赞文章
     *
     * 查询指定用户是否已对指定文章点赞。
     *
     * @param userId 用户ID
     * @param articleId 文章ID
     * @return 点赞记录，如果未点赞则返回null
     */
    ArticleLike ifExist(@Param("userId") Long userId, @Param("articleId") Long articleId);

    /**
     * 删除用户的文章点赞记录
     *
     * 删除指定用户对指定文章的点赞记录。
     *
     * @param userId 用户ID
     * @param articleId 文章ID
     */
    void delete(@Param("userId") Long userId, @Param("articleId") Long articleId);

    /**
     * 减少文章点赞数
     *
     * 将指定文章的点赞数减1。
     *
     * @param id 文章ID
     * @return 影响的行数
     */
    int unlike(Long id);

    /**
     * 添加文章点赞记录
     *
     * 创建新的文章点赞记录。
     *
     * @param articleLike 点赞记录实体
     */
    void add(ArticleLike articleLike);

    /**
     * 根据文章ID获取评论信息
     *
     * 查询指定文章的评论信息。
     *
     * @param id 文章ID
     * @return 评论VO对象
     */
    CommentVO getComment(Long id);

}
